package com.groep14.project;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.groep14.model.ActiveOffer;
import com.groep14.model.Person;

/**
* De WinkelwagenController handelt requests af komende van de winkelwagen pagina.
*
* @since R37 - 24 April 2012
* @author Breght Van Tongerloo
*/

@Controller
public class WinkelwagenController {
	
	/**
	 * De ShoppingCartCheckup methode wordt uitgevoerd als er een request wordt ontvangen met waarde '/productCheckup'.
	 * Er wordt gekeken op welke knop in de Notebooks-pagina geklikt werd om zo de opgevraagde pagina te openen.
	 * 
	 * @param request Uitbreiding van de ServletRequest en voorziet meer request informatie voor HTTP-Servlets
	 * @param session Uitbreiding van de ServletRequest en voorziet meer request informatie voor HTTP-Servlets
	 * @param response Uitbreiding van de ServletRequest en voorziet meer request informatie voor HTTP-Servlets
	 * @return ModelAndView Geeft de gevraagde view terug met de bijhorende gegevens
	 */
	
	List<ActiveOffer> ShoppingCart = new LinkedList<ActiveOffer>();
	ResultSet resultSet = null;
	MyLogger logger = new MyLogger();
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/ShoppingCartCheckup", method = RequestMethod.POST)
	public ModelAndView ShoppingCart(HttpServletRequest request,HttpServletResponse response,HttpSession session) {
		
		ModelAndView modelAndView = new ModelAndView("winkelwagen");
		ShoppingCart = (List<ActiveOffer>) session.getAttribute("ShoppingCartList");
		Validator validator = new Validator();
		 Person p = (Person) session.getAttribute("person");

		if(request.getParameter("btnPAdd") != null){
			return new ModelAndView("redirect:notebooks");
		}
		
	if (validator.validateNumber(request.getParameterValues("amount"), 1, 10, true)) {

		//aantal opslaan wanneer nodig
		if(request.getParameter("btnlogin") != null){
			
			if (request.getParameter("amount") != null){

				String [] amountString = new String [ShoppingCart.size()];
				amountString = request.getParameterValues("amount");
			int[] amountM = new int[ShoppingCart.size()];
			amountM = ConvertAmount(amountString, ShoppingCart);
			ShoppingCart = AddAmount(ShoppingCart, amountM);
			session.setAttribute("winkelwagenlist", ShoppingCart);
			
			}
			
			return new ModelAndView("redirect:login");	
			
		}
		
		//product verwijderen uit ShoppingCart
				if(request.getParameter("btnRemoveP") != null){
					modelAndView = (ModelAndView) session.getAttribute("ShoppingCart");
					for(ActiveOffer a : ShoppingCart){
								
						if(a.getEAN_UCC_13() == Integer.parseInt(request.getParameter("btnRemoveP"))){
								ShoppingCart.remove(a);	
								modelAndView.addObject(ShoppingCart);
								session.setAttribute("ShoppingCart", modelAndView);
								session.setAttribute("ShoppingCartList", ShoppingCart);
							break;
						}
								
					}
					ShoppingCart = (List<ActiveOffer>) session.getAttribute("ShoppingCartList");
					modelAndView = (ModelAndView) session.getAttribute("ShoppingCart");
					if(ShoppingCart.size() == 0){
						modelAndView.addObject("id", null);
						session.setAttribute("ShoppingCart", modelAndView);
					}
				}
				
						//ShoppingCart wegschrijven
						if (request.getParameter("btnNext") != null){
							//int count = 0;
							int[] amountM = new int[ShoppingCart.size()];
							String [] amountString = new String [ShoppingCart.size()];
							amountString = request.getParameterValues("amount");							
							if(session.getAttribute("amountM") != null){
								amountM = (int[]) session.getAttribute("amountM");
								
							}else{
								amountM = ConvertAmount(amountString, ShoppingCart);
							}
		
							ShoppingCart = AddAmount(ShoppingCart, amountM);
							int amount = 0;
					  
							//ShoppingCart doorlopen
							for(ActiveOffer a : ShoppingCart){
							try {
								
								ResultSet AantalResultset;
								int aantalDatabase = 0;
								
								//amount uit de database ophalen
								Connectie con = new Connectie();
								con.setpStatement(con.getCon().prepareStatement("select aantal from persons_in_offer where Pers_id = ? and Offer_id = ?"));
								con.getpStatement().setInt(1, p.getPers_id());
								con.getpStatement().setInt(2, a.getOffer_id());
								AantalResultset = con.getpStatement().executeQuery();
								
								 while ( AantalResultset.next() ) {
									 
									 aantalDatabase = AantalResultset.getInt(1);	 
								 }
							 
								//wanneer het record al bestaat -> updaten					 
								if (aantalDatabase >=1){
									amount = a.getAmount() + aantalDatabase;
									con.setpStatement(con.getCon().prepareStatement("update persons_in_offer SET aantal=? where Pers_id = ? and Offer_id = ?"));
									con.getpStatement().setInt(1, amount);
									con.getpStatement().setInt(2, p.getPers_id());
									con.getpStatement().setInt(3, a.getOffer_id());
									
									con.getpStatement().executeUpdate();
									
									
							        con.closepStatement();
							        con.closeCon();
								}else{ 
									// anders nieuwe record invoegen
									con.setpStatement(con.getCon().prepareStatement("insert into persons_in_offer values (?,?,?)"));
									con.getpStatement().setInt(1, p.getPers_id());
									con.getpStatement().setInt(2, a.getOffer_id());
									con.getpStatement().setInt(3, a.getAmount());
									con.getpStatement().executeUpdate();
									
									
								        con.closepStatement();
								        con.closeCon();
								}
									
								session.removeAttribute("ShoppingCart");
								session.removeAttribute("ShoppingCartList");
				
					}catch (SQLException e) {
						logger.logException(getClass() + "- ", e);
					} catch (ClassNotFoundException e) {
						logger.logException(getClass() + "- ", e);
					} catch (InstantiationException e) {
						logger.logException(getClass() + "- ", e);
					} catch (IllegalAccessException e) {
						logger.logException(getClass() + "- ", e);
					} catch (Exception e) {
						logger.logException(getClass() + "- ", e);
					}
							
			}	
				return new ModelAndView("redirect:voltooid");						
			}
						
		} else {
			System.out.println("Not valid");
			
		}
		
		return modelAndView;
	}
	
	/**
	 * De ConvertAmount methode zet alle strings in een list om naar integers en geeft deze terug.
	 * 
	 * @param amountString String-array met Integer waardes
	 * @return IntegerArray
	 */
	
	public int[] ConvertAmount( String[] amountString, List<ActiveOffer> ShoppingCart){
		int[] amountM = new int[ShoppingCart.size()];
		try{for (int i = 0; i < amountString.length; i++) {
			
			amountM[i] = Integer.parseInt(amountString[i]);
			
			}
		} catch(NumberFormatException e){
			logger.logException(getClass() + "- ", e);
		}
		return amountM;
	}
	
	/**
	 * De AddAmount voegt een aantal toe aan een AciveOffer object.
	 * 
	 * @param ShoppingCart List<ActiveOffer> een lijst met ActiveOffer objecten
	 * @param amountM Integer-Array
	 * @return List<ActiveOffer>
	 */
	
	public List<ActiveOffer> AddAmount(List<ActiveOffer> ShoppingCart, int[] amountM){
		int count = 0;
		for(ActiveOffer a : ShoppingCart){
			a.setAmount(amountM[count]);
			count = count + 1;
		}
		return ShoppingCart;
	}
}
